package eva.savant.business.contabilidad.view

import eva.savant.business.contabilidad.service.TSContabilidad
import eva.savant.businessobject.cg.Preasiento
import eva.savant.businessobject.cg.Partida
import eva.savant.businessobject.cg.Asiento
import eva.savant.businessobject.cg.Cuenta
import eva.savant.core.view.Bean

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct
import javax.faces.convert.Converter
import org.primefaces.event.SelectEvent

@SessionScoped
@ManagedBean(name = 'ITAsientoLote')
public class ITAsientoLote extends Bean {

  TSContabilidad tsContabilidad; def cont, preasientoId , lsPreasiento

  class AsientoVenta { def rowId, fecha, docRef, glosa; Cuenta cuentaD, cuentaH; BigDecimal monto }

  @PostConstruct
  public void cleanEntity() {

    tsContabilidad= (TSContabilidad) getSpringBean('tsContabilidad')


    entity =  new AsientoVenta()

    entity.cuentaD= new Cuenta()

    entity.cuentaH= new Cuenta()

    entity.fecha= new Date()


    lsEntity= new ArrayList<AsientoVenta>(); cont= 1

    lsPreasiento= find(Preasiento.class,'')
  }

  public void detailAdd() {

    if(entity.cuentaD?.id == null) { addErrorMessage 'Debe seleccionar una cuenta contable para el debe'; return; }

    if(entity.cuentaH?.id == null) { addErrorMessage 'Debe seleccionar una cuenta contable para el haber'; return; }


    def x= new AsientoVenta()

    x.rowId  = entity.rowId != null? entity.rowId : cont++

    x.fecha  = entity.fecha

    x.docRef = entity.docRef

    x.cuentaD= entity.cuentaD

    x.cuentaH= entity.cuentaH

    x.monto  = entity.monto

    x.glosa  = entity.glosa


    def isNew= true; for(int i=0; i < lsEntity.size(); i++) { def o= lsEntity.get(i)

    if(o.rowId == x.rowId) { lsEntity.set(i,x); isNew= false; break }  }


    if(isNew) lsEntity.add x


    entity =  new AsientoVenta()

    entity.cuentaD= new Cuenta()

    entity.cuentaH= new Cuenta()

    entity.fecha= new Date()
  }

  public void detailEdit(SelectEvent event) {

    def x= (AsientoVenta) event.object

    entity        = new AsientoVenta()

    entity.rowId  = x.rowId

    entity.fecha  = x.fecha

    entity.docRef = x.docRef

    entity.cuentaD= x.cuentaD

    entity.cuentaH= x.cuentaH

    entity.monto  = x.monto

    entity.glosa  = x.glosa
  }

  public void detailDelete(AsientoVenta x) {

    for(int i=0; i < lsEntity.size(); i++) { def o= lsEntity.get(i)

    if(o.rowId == x.rowId) { lsEntity.remove(i); break }  }
  }

  public void uiMergeE() {

    if(lsEntity?.size() < 1) { addErrorMessage 'El detalle cuentas esta vacio'; return }

    def preasiento= get(Preasiento.class,new Integer(preasientoId + ''))


    for(e in lsEntity) {

      def x= new Asiento()

      x.tipo = preasiento.tipo

      x.fecha= e.fecha

      x.detalle= e.glosa

      x.importe= e.monto

      x.referencia= e.docRef

      x.lsPartida= new ArrayList<Partida>(); alta(x)


      preasiento.lsPreasientoDetalle.each { println 'cuenta: '+it.cuenta.nombre

      def p= new Partida()

      p.cuenta= it.cuenta.codigo.equalsIgnoreCase('1')? e.cuentaD :

                it.cuenta.codigo.equalsIgnoreCase('2')? e.cuentaH : it.cuenta

      p.debe  = it.grupo.equalsIgnoreCase('DEBE')?  (it.porcentaje/100) * e.monto : 0

      p.haber = it.grupo.equalsIgnoreCase('HABER')? (it.porcentaje/100) * e.monto : 0


      x.lsPartida.add p }


      tsContabilidad.mergeAsiento(x)
    }

    addInfoMessage 'Se registro correctamente los Asientos Contables'; cleanEntity();
  }

  public List complete(String value) { return completeLike(Cuenta.class,'tipo= 0 and nombre',value) }

  public Converter getConverter() { return converterLike(Cuenta.class) }

}

